"""
1.mongdb和python交互
    pymongo 提供了mongdb和python交互的所有方法
    安装方式: pip install pymongo
"""
# 2.使用pymongo
# 2.1导入pymongo并选择要操作的集合
# 数据库和集合能够自动创建

# 2.1.1 (无认证时)无需权限认证的方式创建连接对象以及集合操作对象
from pymongo import MongoClient

# 如果是本地连接host,port参数可以省略
# client = MongoClient(host,port)
# 创建客户端对象
client = MongoClient()

# 选择要操作的数据库以及集合
# collection = client[db名][集合名]
# collection = client['py_stu']['stus']
# collection = client.db名.集合名
collection = client.py_stu.stus

"""
2.2 insert()添加数据   insert可以批量的插入数据列表，也可以插入一条数据
    collection.insert({一条数据})
    collection.insert([{数据一},{数据二}])
"""
# # 2.2.1 添加一条数据  返回插入数据的_id
# ret = collection.insert({"name": "张三", "age": 18})
# print(ret)
#
# # 2.2.2 添加多条数据   返回ObjectId对象构成的列表
# item_list = [{'name': '王五'}, {'name': '赵吏'}, {'name': '李四'}]
# rets = collection.insert(item_list)
# # print(rets)
# for ret in rets:
#     print(ret)

"""
2.3 find_one()查找一条数据
    接收一个字典形式的条件，返回字典形式的整条数据 如果条件为空，则返回第一条
"""
# ret = collection.find_one({'name': '王五'})
# print(ret)  # 包含mongodb的ObjectId对象的字典
# print(type(ret))    # <class 'dict'>
# _ = ret.pop('_id')  # 清除mongodb的ObjectId对象的k,v
# print(ret)

"""
2.4 find()查找全部数据
    返回所有满足条件的结果，如果条件为空，则返回全部 结果是一个Cursor游标对象，是一个可迭代对象，可以类似读文件的指针，但是只能够进行一次读取返回所有满足条件的结果，如果条件为空，则返回全部 结果是一个Cursor游标对象，是一个可迭代对象，可以类似读文件的指针，但是只能够进行一次读取
"""
# rets = collection.find()
# # # Cursor 返回是一个游标对象
# # # <pymongo.cursor.Cursor object at 0x7fa6a617d2e8>
# # print(rets)
# # for ret in rets:
# #     print(ret)
# # print('-'*40)
# # # 只能够进行一次读取
# # for ret in rets:    # 此时rets中没有内容
# #     print(ret)
# # print('-'*40)
# # 为方便后续多次使用可以转换成列表
# data_list = list(rets)
# print(data_list)

"""
2.5 update()更新数据(全文档覆盖或指定键值，更新一条或多条)
    语法：collection.update({条件}, {'$set':{指定的kv或完整的一条数据}}, multi=False/True, upsert=False/True)
    multi参数：默认为False,表示更新一条; multi=True则更新多条; multi参数必须和$set一起使用
    upsert参数：默认为False; upsert=True则先查询是否存在,存在则更新;不存在就插入
    $set表示指定字段进行更新
"""
# 2.5.1 更新一条数据；全文档覆盖；存在就更新，不存在就插入
# res = collection.update({'name': '张三'}, {'name': '李思思'}, upsert=True)
# print(res)

# 2.5.2 更新一条数据；指定键值；存在就更新，不存在就插入
# res = collection.update({'name': '张三'}, {'$set': {'name': '刘杰'}}, upsert=True)
# print(res)

# 2.5.3 更新多条数据；全文档覆盖；存在就更新，不存在就插入
# res = collection.update({}, {'$set': {'classes':'python01'}}, multi=True)
# print(res)

# 2.5.4 更新多条数据；指定键值；存在就更新，不存在就插入
# res = collection.update({'name': '王五'}, {'$set': {'name': '老王'}}, multi=True, upsert=True)
# print(res)

# 2.6 delete_one()删除一条数据
# collection.delete_one({"name": "张三"})

# 2.7 delete_many()删除全部数据
# collection.delete_many({"name": "老王"})

# # 删除集合
# # 删除集合终端命令: db.集合名称.drop()
# collection.drop()


# #####################################################
# # 2.1.2 需要权限认证的方式创建连接对象以及集合操作对象
# from pymongo import MongoClient
# from urllib.parse import quote_plus
#
# user = 'python'  # 账号
# password = 'python'  # 密码
# host = '127.0.0.1'  # host
# port = 27017  # port
# uri = "mongodb://%s:%s@%s" % (quote_plus(user),
#                               quote_plus(password),
#                               host)
# # quote_plus函数：对url进行编码
# # uri = mongodb://python:python@127.0.0.1
# client = MongoClient(uri, port=port)
# # collection = client.db名.集合名
# collection = client.users.stu
